package config

import (
	"embed"
	"encoding/json"
	"os"
)

//go:embed default.json
var ConfigDefault embed.FS

var config *Config

// 加载配置文件列表
var fileList []string = []string{
	"/etc/sql-backups/sql-backups.json",
	"/etc/sql-backups/config.json",
	"/etc/sql-backups.json",
	"config.json",
	".env.json",
	"/home/xiaoyutab/go/src/gitee.com/xiaoyutab/sql-backups/.env.json",
}

// 配置格式
type Config struct {
	FromType string  `json:"from_type"` // 数据库中的数据类型，支持mysql、
	MySQL    []MySql `json:"mysql"`     // MySQL数据来源
	MaxLimit int     `json:"max_limit"` // 单次查询最大条数
	FileName string  `json:"file_name"` // 备份文件位置/文件名【后面会自动追加 `_yyyyMMdd.db`】后缀，sqlite格式存储，按天拆分
}

// MySQL配置格式
type MySql struct {
	Host      string          `json:"host"`      // 数据库地址
	Port      int             `json:"port"`      // 数据库端口
	Databases string          `json:"databases"` // 数据库名称
	User      string          `json:"user"`      // 数据库用户名
	Pass      string          `json:"pass"`      // 数据库用户密码
	Backups   []BackupsConfig `json:"backups"`   // 备份表配置
}

type BackupsConfig struct {
	Table     string `json:"table"`      // 要备份的表
	ID        string `json:"id"`         // 主键字段名称【自增主键】
	CTimes    string `json:"ctime"`      // 时间字段名称【插入时间字段，用于标识是否需要备份/删除】
	CTimeUnix string `json:"ctime_unix"` // 时间戳字段名称【插入时间字段，用于标识是否需要备份/删除】
	Times     int    `json:"times"`      // 备份的时间间隔【单位：天，即xxx天以前的数据按顺序进行备份/删除】
	IsDelete  int    `json:"is_delete"`  // 备份后的数据是否删除【1-删除 2-不删除】
}

// 获取配置对象
func GetConfig() *Config {
	if config == nil {
		config = &Config{}
		// 读取默认配置
		cont, err := ConfigDefault.ReadFile("default.json")
		if err != nil {
			panic("默认配置文件加载失败")
		}
		err = json.Unmarshal(cont, config)
		if err != nil {
			panic("默认配置文件读取失败")
		}
		// 进行JSON配置读取、赋值
		for _, v := range fileList {
			if _, err := os.Stat(v); err == nil {
				conf := &Config{}
				// 如果文件存在
				fp, err := os.OpenFile(v, os.O_RDONLY, 0755)
				if err != nil {
					panic("配置文件读取错误：" + err.Error())
				}
				defer fp.Close()
				data := make([]byte, 1<<16) // 读取配置文件，限制配置文件大小为64KB
				n, err := fp.Read(data)
				if err != nil {
					panic("配置文件读取错误：" + err.Error())
				}
				err = json.Unmarshal(data[:n], conf) // 格式化JSON
				if err != nil {
					panic("JSON文件格式错误【" + v + "】：" + err.Error())
				}
				rootReplace(conf)
				mysqlReplace(conf)
			}
		}
	}
	return config
}
